package com.edu.ahm.thread;
// 死锁 ： 多个线程相互抱着对方需要的资源 然后形成僵持
//产生死锁的必要条件
//  互斥条件
// 请求和保持
// 不允许剥夺
// 循环等待
public class DeadLock {
    public static void main(String[] args) {
        Makeup girl1 = new Makeup(0,"第一个女孩");
        Makeup girl2 = new Makeup(1,"第二个女孩");

        girl1.start();
        girl2.start();

    }

}
class Lipstick{

}

class Mirror{

}

class Makeup extends Thread{
    // 需要的 资源只有一份 static 来保证只有一份
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();

    int choice; // 选择
    String girlName; // 使用化妆品的人

    Makeup (int choice,String girlName){
        this.choice = choice;
        this.girlName = girlName;
    }

    @Override
    public void run() {
        // 化妆
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    // 化妆 需要拿到对方的资源
    private void makeup() throws InterruptedException {
        if (choice == 0) {
            synchronized (lipstick) {
                // 获得口红的锁
                System.out.println(this.girlName + "获得口红的锁");
                Thread.sleep(1000);
            }
            // 一秒钟后要获得镜子
            synchronized (mirror) {
                System.out.println(this.girlName + "获得镜子的锁");
            }
        } else {
            synchronized (mirror) {
                // 获得镜子的的锁
                System.out.println(this.girlName + "获得镜子的锁");
                Thread.sleep(2000);

            }
            // 一秒钟后要获得口红
            synchronized (lipstick) {
                System.out.println(this.girlName + "获得口红的锁");
            }
        }

    }
}



